package br.np2tec.soa.servicos;

import java.util.Iterator;
import java.util.List;
import javax.jws.WebService;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.ws.WebServiceRef;

/**
 *
 * @author Flavio
 */
@WebService()
public class VerificarLimiteCreditoService {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarPropostaCreditoDataServiceService/TratarPropostaCreditoDataService?WSDL")
    TratarPropostaCreditoDataServiceService tratarPropostaCreditoDataServiceService;
    
    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarClienteDataServiceService/TratarClienteDataService?WSDL")
    TratarClienteDataServiceService tratarClienteDataServiceService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarCreditosConcedidosDataServiceService/TratarCreditosConcedidosDataService?WSDL")
    TratarCreditosConcedidosDataServiceService tratarCreditosConcedidosDataService;


   /**
     * Verifica os créditos já concedidos para um cliente e calcula o limite de crédito obtendo 20% da renda do cliente
     * diminuídos do somatório do valor das parcelas não pagas.
     * @param cpf
     * @return
     */
    public Double verificarLimiteCredito(String cpf) {
        Double limiteCredito = 0.0;
        Double somatorioParcelas = 0.0;
        List listaPropostaCredito = tratarPropostaCreditoDataServiceService.getTratarPropostaCreditoDataServicePort().listarPropostaCreditoCpfCliente(cpf);
        Cliente cliente = tratarClienteDataServiceService.getTratarClienteDataServicePort().consultar(cpf);

         Iterator it = listaPropostaCredito.iterator();
         while(it.hasNext()) {
             PropostaCredito propostaCredito = (PropostaCredito)it.next();

            List<CreditosConcedidos> listaCreditosConcedidos = tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().listarCreditosConcedidos(propostaCredito.getNumeroProposta());

            for (CreditosConcedidos creditosConcedidos : listaCreditosConcedidos) {

                List<Parcela> parcelas = creditosConcedidos.getParcelas();

                for (Parcela parcela : parcelas) {
                    XMLGregorianCalendar dataPagamento = parcela.getDataPagamento();
                    if (dataPagamento != null) {
                        somatorioParcelas += parcela.getValor();
                    }
                }
            }
        }

        limiteCredito = (cliente.getRenda() * 0.20) - somatorioParcelas;

        return limiteCredito;
    }

    public double calcularTotalParcelas(CreditosConcedidos creditosConcedidos) {
        Double somatorioParcelas = 0.0;
        List<Parcela> parcelas = creditosConcedidos.getParcelas();

        for (Parcela parcela : parcelas) {
            XMLGregorianCalendar dataPagamento = parcela.getDataPagamento();
            if (dataPagamento != null) {
                somatorioParcelas += parcela.getValor();
            }
        }
        return somatorioParcelas;
    }

    /**
     * Método responsável por aprovar ou reprovar uma proposta de crédito.
     * Verifica se o limite de crédito do cliente, obtido através da proposta de crédito, é maior ou igual ao valor das parcelas da proposta de crédito em questão
     * alterando a situação da proposta para "Aprovado",caso contrário altera a situação da proposta para "Reprovado".
     *
     * @param numeroPropostaCredito
     */
    public boolean aprovarCredito(Long numeroPropostaCredito) {
        PropostaCredito propostaCredito = tratarPropostaCreditoDataServiceService.getTratarPropostaCreditoDataServicePort().consultarPropostaCredito(numeroPropostaCredito);

        Cliente cliente = propostaCredito.getCliente();

        double limiteCreditoCliente = verificarLimiteCredito(cliente.getCpf());

        CreditosConcedidos creditosConcedidos = tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().consultarCreditosConcedidos(propostaCredito.getNumeroProposta());
        List<Parcela> parcelas = creditosConcedidos.getParcelas();
        double somatorioParcelasProposta = 0;
        for (Parcela parcela : parcelas) {
            somatorioParcelasProposta += parcela.getValor();
        }

        if (limiteCreditoCliente >= somatorioParcelasProposta) {
            tratarPropostaCreditoDataServiceService.getTratarPropostaCreditoDataServicePort().alterarPropostaCredito(null, null, "A", null, numeroPropostaCredito);
            return true;
        } else {
            tratarPropostaCreditoDataServiceService.getTratarPropostaCreditoDataServicePort().alterarPropostaCredito(null, null, "R", null, numeroPropostaCredito);
            return false;
        }
    }

}
